lexer grammar AnalexXMLLexer;

options {
  language = Java;
}

@lexer::header {
  package Practica9.Errores;
}

@lexer::members {
  boolean tagMode = false;
  private ArrayList<String> errors = new ArrayList<String>();
  public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
    String hdr = getErrorHeader(e);
    String msg = getErrorMessage(e, tokenNames);
    errors.add(hdr + " " + msg);
  }
   
  public ArrayList<String> getErrors() {
    return errors;
  }
}

fragment SALTO_LINEA:  ('\r''\n' | '\r' | '\n');
fragment LETRA: 'a'..'z' | 'A'..'Z' | '_';
fragment DIGITO: '0'..'9';

KEYWORD_BIBLIOTECA
  : { tagMode }? => ('biblioteca')
  ;
  
KEYWORD_LIBRO
  : { tagMode }? => ('libro')
  ;
  
KEYWORD_AUTOR
  :  { tagMode }? => ('autor')
  ;
  
KEYWORD_TITULO
  :  { tagMode }? => ('titulo')
  ;
  
KEYWORD_EDITORIAL
  :  { tagMode }? => ('editorial')
  ;
 
INIT_TAG : '<' { tagMode = true; } ;
OUT_TAG : '</' { tagMode = true; } ;
FIN_TAG : { tagMode }? '>' { tagMode = false; } ;
 
BLANCO: (' ' | '\t' | SALTO_LINEA) {skip();};
COMENTARIO: '<!--' (options {greedy=false;}:SALTO_LINEA|.)* '-->' {skip();};
ATTR_EQ : { tagMode }? '=' ;
ATTR_VALUE : { tagMode }? ( '"' (~'"')* '"' | '\'' (~'\'')* '\'');
PCDATA : { !tagMode }?=> LETRA (~'<')+;
ID: { tagMode }? (LETRA)+;